/*! ****************************************************************************
 * \file Converter.h
 * \brief
 *
 ******************************************************************************/

#ifndef CONVERTER_H
#define CONVERTER_H

//==============================================================================
//
//    I N C L U D E S
//
//==============================================================================

#include <iostream>
#include <string>
#include <sstream>
#include <exception>
#include <typeinfo>

namespace tsc
{
namespace common
{

//==============================================================================
//
//    C L A S S
//
//==============================================================================

class Converter
{
public:
  static Converter* instance();

  //----------------------------------------------------------------------------
  //
  // converts given type to string
  //
  //----------------------------------------------------------------------------
  template <typename T>
  std::string typeToString(T &aVal)
  {
    std::ostringstream oss;

    oss << aVal;

    return oss.str();
  } // Converter::typeToString

  //----------------------------------------------------------------------------
  //
  // converts string to a given type
  //
  //----------------------------------------------------------------------------
  template <typename T>
  T stringToType(std::string &aVal) throw(std::ios_base::failure)
  {
    std::istringstream iss(aVal);
    T returnVal;

    if (!(iss >> returnVal))
    {
      std::ios_base::failure exc("Converter::stringToType<T> [with T="
                                 + std::string(typeid(T).name())
                                 + "]. Cannot convert type to string.");
      throw exc;
    }

    return returnVal;
  } // Converter::stringToType<T>

protected:
  static Converter* mInstance;

private:
  Converter();
};

} // namespace common
} // namespace tsc

#endif // CONVERTER_H
